package pe.com.nextel.http;

import javax.microedition.io.HttpConnection;
import javax.microedition.io.Connector;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Es la clase que se encarga de iniciar una conexion Http. Envia el mensaje encapsulado
 * en el objeto mensajeHttp. Descomprime el mensaje recibido y lo encapsula en el
 * objeto mensajeHttp. Informa al httpListener los distintos eventos de la
 * conexion.
 * <p>
 * La clase Http implementa la interface Runnable, para iniciar el proceso de
 * conexi�n, luego de crear la clase, se debe invocar al metodo connect(). Este
 * m�todo inicia el hilo de conexi�n.
 * <p>
 * Ver grafico de proceso de conexion HTTP.
 *
 * @author NEXTEL DEL PERU S.A.
 * @version 1.0
 */
public class HttpSimple {
    //Valores estaticos del status de la conexion
//    public static final int HTTP_TRYING_CONNECTION_STATUS = 0;
//    public static final int HTTP_CONNECTED_STATUS = 1;
//    public static final int HTTP_DATA_SENDING_STATUS = 2;
//    public static final int HTTP_DATA_RECEIVING_STATUS = 3;
//    public static final int HTTP_TERMINATED_OK_STATUS = 4;
//    public static final int HTTP_CLOSING_STATUS = 5;
//    public static final int HTTP_TERMINATED_STATUS = 6;
//    private HttpListener httpListener;
//    public String mensaje ;
//    public String url ;
    public XMLListener listener;
    public MensajeHttp mensajeHttp;
    public FrmHttpListener frmListener;
    
    public synchronized void makeConnection(XMLListener plistener, FrmHttpListener frm) throws Exception {
        
        listener = plistener;
        frmListener = frm;

        HttpConnection conn = null;
        try {
            
//            httpListener.receiveStatus(this, HTTP_TRYING_CONNECTION_STATUS);
            listener.printSuperior("connecting..");
             conn = (HttpConnection) Connector.open(mensajeHttp.getUrl(), Connector.READ_WRITE, true);
        
            //obtenemos la conexion
             getConnection(conn);
            
            //enviamos datos si existe
            setOutputStream(conn, mensajeHttp.getMensaje());
            
            // lee el mensaje del servidor
//            System.out.println("Lee mensaje");
            setInputStrem(conn);
            
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                conn = null;
            }
        }
        listener.printSuperior("Finishing..");

    }
    
    
    
    /**
     * Setea el httpListener para la clase.
     * @param httpListener el httpListener, si es null remueve el anterior.
     */
//    public void setHttpListener(HttpListener httpListener) {
//        this.httpListener = httpListener;
//    }
//
    /**
     * Obtiene el mensaje del servidor
     * @param conn
     * @throws com.nextel.http.HttpException
     */
    private void setInputStrem( HttpConnection conn) throws Exception {
//        System.out.println("setInputStrem");
        InputStream in = null;
        try{
            in = conn.openInputStream();
            
            //solo funciona para servidores asp, aspx java en php se raya
//            mensajeHttp.setLongitud(conn.getLength());
            
//            System.out.println("conn.getLength()" + conn.getLength( ));
            
            if (conn.getResponseCode() == HttpConnection.HTTP_OK) {
                
                mensajeHttp.setExisteError(false);
                mensajeHttp.setInput(in);
                listener.printSuperior("Receiving...");

                frmListener.notifyHttpEnd(mensajeHttp);
            } else {
                listener.print("Error..." +  conn.getResponseCode());
                System.out.println("RESPONSE CODE -: " + conn.getResponseCode());
                StringBuffer sbRespuesta = new StringBuffer();
                
                byte[] arrByte = new byte[1024];
                
                
                int len;
                while ((len = in.read(arrByte)) != -1) {
                    sbRespuesta.append(new String(arrByte, 0, len));
                }
                System.out.println(sbRespuesta.toString());
                
                
                mensajeHttp.setExisteError(true);
                mensajeHttp.setMensaje(("Error: Servidor " + conn.getResponseCode( )).getBytes());

                frmListener.notifyHttpError(mensajeHttp);
//                httpListener.receiveStatus(this, HTTP_TERMINATED_OK_STATUS);
                // throw new HttpException(conn.getResponseCode(), sbRespuesta.toString());
            }
        }finally{
            if(in != null){
                in.close();
                in = null;
            }
        }
        
    }
    
    /**
     * Metodo que envia al servidor
     *
     **/
    private void setOutputStream(HttpConnection conn, byte[] data) throws Exception {
//        System.out.println("setOutputStream");
        
        OutputStream out = null;
        try {
            
            if (data != null && data.length > 0) {
                
                conn.setRequestProperty("Content-Length", String.valueOf(data.length));
                
                out = conn.openOutputStream();
                 listener.printSuperior("Sending...");
//                httpListener.receiveStatus(this, HTTP_DATA_SENDING_STATUS);
                
                out.write(data);
                
                out.flush();
                
                data = null;
                
                System.gc();
            }
            
        } finally {
            if (out != null) {
                out.close();
                out = null;
            }
        }
    }
    
    private void getConnection(HttpConnection conn) throws Exception {
        conn.setRequestMethod(mensajeHttp.getTipoEnvio());
        conn.setRequestProperty("Connection", "Close");
        conn.setRequestProperty("Cache-Control", "no-cache");
        conn.setRequestProperty("Pragma", "no-cache");
        conn.setRequestProperty("Expires", "Tue, 1 Jul 1997 00:00:00 GMT");
        conn.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.0");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    }
}
